import {
  Controller,
  Get,
  Params,
  Query,
  Post,
  Body,
  Header,
  Ctx,
  Flow,
} from "koa-ts-controllers";
import { Context } from "koa";
import { IsNotEmpty, IsNumberString } from "class-validator";
import Boom from "@hapi/Boom";
import authorization from "../middlewares/authorization";

/**
 *  类装饰器
 *  @Controller(basePath?)
 *
 *    将此类指定为控制器类，即控制器动作的容器
 *    basepath前缀为此类中的所有操作路径
 *
 *  @Flow([midleware])
 *
 *  方法装饰器
 *
 *    @Get(path)
 *    @Post(path)
 *    @Patch(path)
 *    @Put(path)
 *    @Delete(path)
 *    @Version(v)
 *    @Flow([midleware])
 *
 *  参数装饰器
 *
 *    @Body() or @Body({required}) or @Body(name)
 *    @State() or @State(name)
 *    @CurrentUser()
 *    @Header() or @Header(name)
 *    @Params() or @Params(name)
 *    @Query() or @Query(name)
 *    @Session() or @Session(name)
 *    @Req()
 *    @Res()
 *    @Ctx()
 */

// 验证类
class ValidateQuery {
  @IsNumberString()
  page: number;
}

class ValidatePostBody {
  @IsNotEmpty({
    message: "用户名不能为空",
  })
  name: string;

  @IsNotEmpty({
    message: "密码不能为空",
  })
  password: string;
}

@Controller("/test")
class TestControllers {
  @Get("/hello")
  async hello() {
    //  访问格式 localhost:8080/api/v1/test/hello
    return "hello, test!";
  }

  // //  验证请求数据, id必须是1位以上的数字，否则返回404错误
  // @Get("/user/:id(\\d+)")
  // async getUser(@Params("id") id: number) {
  //   //  async GetUser(params: {id: string})  也可以
  //   return `当前params中的用户id是${id}`;
  // }

  // @Get("/user")
  // async getUser(@Query() query: { id: number; name: string }) {
  //   //  访问格式 localhost:8080/api/v1/test/user?id=412&name=qweasd
  //   return `获得的用户id: ${query.id}, 用户的名称: ${query.name}`;
  // }

  // @Post("/create")
  // async postUser(
  //   @Body() body: {  name: string, password: string },
  //   @Header() header: any
  // ) {
  //   console.log(header);
  //   return `提交的用户的名称: ${body.name}, 用户id: ${body.password}, `;
  // }

  //  添加中间件, 授权之后才能访问
  @Flow([authorization])
  @Get("/user")
  async getUser(@Query() query: ValidateQuery) {
    //  访问格式 localhost:8080/api/v1/test/user?page=1

    //  Boom 自带错误提示功能，class-validator自带Boom
    if (query.page >= 2) {
      throw Boom.badData("数据格式不正确", "page 不能大于2");
    }

    return `传过来的query: ${JSON.stringify(query)}`;
  }

  @Post("/create")
  async postUser(
    @Ctx() ctx: Context,
    @Body() body: ValidatePostBody,
    @Header() header: any
  ) {
    console.log(header);

    ctx.status = 201;
    return {
      id: 1,
      name: body.name,
      createdAt: new Date(),
    };
  }
}
